
/*
    Chemistry Formula Balancer

	作者：xkhhdx (xkhhdx [at] gmail [dot] com)
	时间：Aug.10th, 2009

	本程序是一个开源的自由软件，你可以在自由软件基金会的 GNU通用公共许可
	证协议 2.0 的许可下改写或修改本软件。

	修改之后请在你的声明信息中保留本段信息。

	请遵循 GNU GPL v2 协议的条款，具体细节请阅读此协议。

    本文件定义了 balancer类。
*/

#ifndef BALANCER_H
#define BALANCER_H

#include "global.h"

#pragma warning (disable:4786)

class balancer
{
  public:

	typedef struct _chemistry_formula	// 化学式信息类
	{
	  public:
		string m_formula;	// 反应物或生成物的化学式
		string m_symbol;	// 符号
		map < string, int >m_element_mass_map;	// 化学式中的每个元素的数目

		int operator <( const struct _chemistry_formula &rhs ) const
		{
			return m_formula < rhs.m_formula;
		}	// 重载 小于号

	}
	chemistry_formula;

	list < chemistry_formula > reacts;	// 反应物
	list < chemistry_formula > outers;	// 生成物

	map < string, int >m_elements;
	set < string > m_elements_set;
	int m_react_atom_count, m_outer_atom_count, m_all_atoms_count;
	map < string, float >m_element_mass_map;

	void append_react( string p_thing );	// 添加反应物
	void append_outer( string p_thing );	// 添加生成物

	void rebuilds();
	void print();
	     balancer();
	void init_element_map();


	float get_element_mass( string p_element_name );
	float get_element_without_bracket_mass( string p_expression, list < chemistry_formula >::iterator * p_piter = 0, char p_job = 1 );

	string get_formula_mass( string p_expression, char p_job = 1, list < chemistry_formula >::iterator * iter = 0 );
	string get_formula_mass( list < chemistry_formula > *p_piter, char p_job = 2 );

	void make_formula();
	void balance();


	float matrix[10][10];	// 临时使用 10*10 的矩阵吧
	int matrix_degree;
	map < char, int >m_coefficient_map;	// 系数

};

#endif // #ifndef BALANCER_H
